package com.huluobo.base.mvvm

import android.util.Log
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.huluobo.base.net.Res
import kotlinx.coroutines.launch
import java.lang.Exception

/**
 *  Created by LC on 2024/9/12.
 */
open class BaseViewModel : ViewModel() {
    //通用的错误LiveData,返回值是个一个错误类型
    val onFailed by lazy { MutableLiveData<Throwable>() }

    fun executeNetRequest(
        s: suspend () -> Res,//suspend 挂起方法, () -> 代表当前参数是一个方法,箭头后的值代表当前方法的返回值
        success: (String) -> Unit,//返回成功的方法,会直接调用成功LiveData的postValue
        failed: (Throwable) -> Unit = onFailed::postValue,//返回错误的方法,传的是个错误(异常)类型,默认值是直接把错误信息保存到onFailed的postValue方法中
        okCode: Int = 200//正确码,默认值是200
    ) {
        viewModelScope.launch {//发起一套协程
            try {
                val res = s.invoke()//调用s这个方法,比如传入的是login(username,password),这里调用的就是login方法,res就是该方法的返回值
                Log.i("TagA", "value:$res")
                if (res.statuesCode.toInt() == okCode) {
                    //成功
                    success(res.values)//请求成功,通过success的livedata保存数据
                } else {
                    //失败
                    failed(RuntimeException(res.msg))
                }
            } catch (e: Exception) {
                //如果网络请求发生错误,走这里
                failed(e)
            }
        }
    }
}